%pylab inline
import matplotlib.pyplot as plt
from ipywidgets import *
Kiegészítés: Cserti József: Kausztikák a fizikában
def reflection(be,nn):
'''
be: a bejovo fenysugar iranyvektora (normalt)
nn: a felulet normalvektora (normalt)
r: a kimeno fenysugar iranyvektora (normalt)
'''
#be=be/sqrt((sum(be**2))) # normalizing
ki=be-2*nn*dot(be,nn)
return(ki)
def line_circle(r0,be,cent,R,elojel):
'''
a kor es az egyenes metszespontjat szamolja
r0 =(x0,y0) az egyenes egy pontja
be: az egyenes iranyvektora (unit vector!)
cent: a kor kozeppontja
R: a kor sugara
'''
cr=cent-r0
l= dot(cr,be)
cr3=array([cr[0],cr[1],0])
be3=array([be[0],be[1],0])
rhovec=cross(cr3,be3)
rho= sqrt(dot(rhovec,rhovec))
s= sqrt(R**2-rho**2)
lsp=l+elojel*s
x1=r0[0]+lsp*be[0]
y1=r0[1]+lsp*be[1]
rp=array([x1,y1]) # a kor es az egyenes metszespontja
tmp=elojel*(cent-array([x1,y1]))
normal=tmp/sqrt(dot(tmp,tmp))
return(rp,normal)
theta=17*pi/180
be=array([cos(theta),sin(theta)])
#be=be/sqrt((sum(be**2))) # normalizing
cent=array([0,0])
Np=57
figsize(16,12)
ax=subplot(aspect='equal')
#ax=subplot(111)
# tukor alakja
fimin, fimax=(-pi/2,pi/2)
fi=linspace(fimin,fimax,200)
plot(cos(fi),sin(fi),color='k',lw=4)
ymax=0.
benyil=0.125*be
arrow(0,0,benyil[0],benyil[1], head_width=0.05, head_length=0.05, fc='b', ec='b',lw=3)
xk=-0.5
yklist=linspace(-1+xk*tan(theta),1+xk*tan(theta),Np)
for yk in yklist:
rk=array([xk,yk])
r0,normal=line_circle(rk,be,cent,1,1)
# bejovo sugarak
if r0[0] >= 0:
plot([rk[0],r0[0]],[rk[1],r0[1]],color='b')
# reflektalt sugarak
rr=reflection(be,normal)
rp,nn=line_circle(r0,rr,cent,1,1)
plot([r0[0],rp[0]],[r0[1],rp[1]],color='r');
xlim(-0.5,1.05)
ylim(yklist[0],1.05)
title('Visszavert fénysugarak (piros), bejövő (kék)\n', fontsize=18);
ax.set_axis_off();
def rajz_gombtukor(thetafok,Np):
theta=thetafok*pi/180
be=array([cos(theta),sin(theta)])
#be=be/sqrt((sum(be**2))) # normalizing
cent=array([0,0])
figsize(10,8)
ax=subplot(aspect='equal')
#ax=subplot(111)
# tukor alakja
fimin, fimax=(-pi/2,pi/2)
fi=linspace(fimin,fimax,200)
plot(cos(fi),sin(fi),color='k',lw=4)
benyil=0.125*be
arrow(0,0,benyil[0],benyil[1], head_width=0.05, head_length=0.05, fc='b', ec='b',lw=3)
xk=-0.5
yklist=linspace(-1+xk*tan(theta),1+xk*tan(theta),Np)
for yk in yklist:
rk=array([xk,yk])
r0,normal=line_circle(rk,be,cent,1,1)
# bejovo sugarak
if r0[0] >= 0:
plot([rk[0],r0[0]],[rk[1],r0[1]],color='b')
# reflektalt sugarak
rr=reflection(be,normal)
rp,nn=line_circle(r0,rr,cent,1,1)
plot([r0[0],rp[0]],[r0[1],rp[1]],color='r');
xlim(-0.5,1.05)
ylim(-1.2,1.05)
title('Visszavert fénysugarak (piros), bejövő (kék)\n', fontsize=18);
ax.set_axis_off();
@interact(theta=(-90,90,5),Np=(10,150,10))
def play(theta=0,Np=20):
rajz_gombtukor(theta,Np)
show();